SD卡介绍 | 您所在的位置:网站首页 › 宾得k3 sd卡速度 › SD卡介绍 |
以下内容来自正点原子的FPGA开发指南,觉得讲的不错,就搬了过来。 一、SD卡简介SD卡的英文全称是Secure Digital Card,即安全数字卡(又叫安全数码卡),是在MMC卡 (Multimedia Card,多媒体卡)的基础上发展而来,主要增加了两个特色:更高的安全性和更快的读写速度。SD卡和MMC卡的长度和宽度都是32mm x 24mm,不同的是,SD卡的厚度为2.1mm, 而MMC卡的厚度为1.4mm,SD卡比MMC卡略厚,以容纳更大容量的存贮单元,同时SD卡比MMC卡触 点引脚要多,且在侧面多了一个写保护开关。SD卡与MMC卡保持着向上兼容,也就是说,MMC卡可以被新的SD设备存取,兼容性则取决于应用软件,但SD卡却不可以被MMC设备存取。SD卡和MMC卡可通过卡片上面的标注进行区分,如下图左侧图片上面标注为“MultiMediaCard”字母样式的为MMC卡,右侧图片上面标注为“SD”字母样式的为SD卡。
不同协议规范的SD卡有着不同速度等级的表示方法。在SD1.0协议规范中(现在用的较少),使用“X”表示不同的速度等级;在SD2.0协议规范中,使用SpeedClass表示不同的速度等级;SD3.0协议规范使用UHS(Ultra High Speed)表示不同的速度等级。SD2.0规范中对SD卡的速 度等级划分为普通卡(Class2、Class4、Class6)和高速卡(Class10);SD3.0规范对SD卡的速度等级划分为UHS速度等级1和3。不同等级的读写速度和应用如下图所示。
SD卡在正常读写操作之前,必须先对SD卡进行初始化,SD卡的初始化过程就是向SD中写入命令,使其工作在预期的工作模式。在对SD卡进行读写操作时同样需要先发送写命令和读命令,因此SD卡的命令格式是学习SD卡的重要内容。SD卡的命令格式由6个字节组成,发送数据时高位在前,SD卡的写入命令格式如下图所示: Byte2~Byte5:命令参数,有些命令参数是保留位,没有定义参数的内容,保留位应设置为0。 Byte6:前7位为CRC(循环冗余校验)校验位,最后一位为停止位0。SD卡在SPI模式下默 认不开启CRC校验,在SDIO模式下开启CRC校验。也就是说在SPI模式下,CRC校验位必须要发,但是SD卡会在读到CRC校验位时自动忽略它,所以校验位全部设置为1即可。需要注意的是,SD卡上电默认是SDIO模式,在接收SD卡返回CMD0的响应命令时,拉低片选CS,进入SPI模式。所 以在发送CMD0命令的时候,SD卡处于SDIO模式,需要开启CRC校验。另外CMD8的CRC校验是始终启用的,也需要启用CRC校验。除了这两个命令,其它命令的CRC可以不用做校验。 SD卡的命令分为标准命令(如CMD0)和应用相关命令(如ACMD41)。ACMD命令是特殊命令,发送方法同标准命令一样,但是在发送应用相关命令之前,必须先发送CMD55命令,告诉SD卡接下来的命令是应用相关命令,而非标准命令。发送完命令后,SD卡会返回响应命令的信息,不同的CMD命令会有不同类型的返回值,常用的返回值有R1类型、R3类型和R7类型(R7类型是CMD8命令专用)。SD卡的常用命令说明如下表(表 39.1.2)所示。
SD卡返回类型R3数据格式如下图所示: SD卡返回类型R7数据格式如下图所示: 由于市面上大多采用SD2.0版本协议的SD卡,接下来我们仅介绍SD2.0版本协议的初始化流程,以下提到的SD卡均代表基于SD2.0版本协议的SDHC卡,其详细初始化步骤如下: 1、 SD卡完成上电后,主机FPGA先对从机SD卡发送至少74个以上的同步时钟,在上电同 步期间,片选CS引脚和MOSI引脚必须为高电平(MOSI引脚除发送命令或数据外,其 余时刻都为高电平); 2、 拉低片选CS引脚,发送命令CMD0(0x40)复位SD卡,命令发送完成后等待SD卡返回响应数据; 3、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为复位完成信号0x01,在接收返回信息期间片选CS为低电平,此时SD卡进入SPI模式,并开始进行下一步,如果返回的值为其它值,则重新执行第2步; 4、 拉低片选CS引脚,发送命令CMD8(0x48)查询SD卡的版本号,只有SD2.0版本的卡才支持此命令,命令发送完成后等待SD卡返回响应数据; 5、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的电压范围为4’b0001即2.7V~3.6V,说明此SD卡为2.0版本,进行下一步,否则重新执行第4步; 6、 拉低片选CS引脚,发送命令CMD55(0x77)告诉SD卡下一次发送的命令是应用相关命令,命令发送完成后等待SD卡返回响应数据; 7、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为空闲信号0x01,开始进行下一步,否则重新执行第6步。 8、 拉低片选CS引脚,发送命令ACMD41(0x69)查询SD卡是否初始化完成,命令发送完成后等待SD卡返回响应数据; 9、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为0x00,此时初始化完成,否则重新执行第6步。 SD卡上电及复位命令时序如下图所示: 至此,SD卡完成了复位以及初始化操作,进入到SPI模式的读写操作。需要注意的是:SD卡在初始化的时候,SPI_CLK的时钟频率不能超过400KHz,在初始化完成之后,再将SPI_CLK的时钟频率切换至SD卡的最大时钟频率。尽管目前市面上的很多SD卡支持以较快的时钟频率进行初始化,为了能够兼容更多的SD卡,在SD卡初始化的时候时钟频率不能超过400KHz。 SD卡读写一次的数据量必须为512字节的整数倍,即对SD卡读写操作的最少数据量为512个字节。我们可以通过命令CMD16来配置单次读写操作的数据长度,以使每次读写的数据量为(n*512)个字节(n≥1),本次SD卡的读写操作使用SD卡默认配置,即单次读写操作的数据量为512个字节。 SD卡初始化完成后,即可对SD卡进行读写测试,SD卡的读写测试是先向SD卡中写入数据,再从SD卡中读出数据,并验证数据的正确性。SD卡的写操作时序图如下图所示:
1、 拉低片选CS引脚,发送命令CMD24(0x58)读取单个数据块,命令发送完成后等待SD卡返回响应数据; 2、 SD卡返回正确响应数据0x00后,等待至少8个时钟周期,开始发送数据头0xfe; 3、 发送完数据头0xfe后,接下来开始发送512个字节的数据; 4、 数据发送完成后,发送2个字节的CRC校验数据。由于SPI模式下不对数据进行CRC校验,直接发送两个字节的0xff即可; 5、 校验数据发送完成后,等待SD卡响应; 6、 SD卡返回响应数据后会进入写忙状态(MISO引脚为低电平),即此时不允许其它操 作。当检测到MISO引脚为高电平时,SD卡此时退出写忙状态; 7、 拉高CS引脚,等待8个时钟周期后允许进行其它操作。 SD卡的读操作时序图如下图所示: 1、 拉低片选CS引脚,发送命令CMD17(0x51)读取单个数据块,命令发送完成后等待SD卡返回响应数据; 2、 SD卡返回正确响应数据0x00后,准备开始解析SD卡返回的数据头0xfe; 3、 解析到数据头0xfe后,接下来接收SD卡返回的512个字节的数据; 4、 数据解析完成后,接下来接收两个字节的CRC校验值。由于SPI模式下不对数据进行CRC校验,可直接忽略这两个字节; 5、 校验数据接收完成后,等待8个时钟周期; 6、 拉高片选CS引脚,等待8个时钟周期后允许进行其它操作。 |
CopyRight 2018-2019 实验室设备网 版权所有 |